leetcode 1033 移动石子直到连续

主要是需要搞清楚移动的方式,接下来就很简单了。

题目

三枚石子放置在数轴上,位置分别为 a,b,c。

每一回合,我们假设这三枚石子当前分别位于位置 x, y, z 且 x < y < z。从位置 x 或者是位置 z 拿起一枚石子,并将该石子移动到某一整数位置 k 处,其中 x < k < z 且 k != y。

当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。

要使游戏结束,你可以执行的最小和最大移动次数分别是多少? 以长度为 2 的数组形式返回答案:answer = [minimum_moves, maximum_moves]

思路

首先将三个数排好序,然后算出中间节点与两边节点的距离,根据距离的大小,分别对应下面的几种情况,第一种,三者互相挨着,这样距离就是1和1,无法移动,输出{0,0},第二种情况,一边是挨着的,另外一边没有挨着,这种情况就是最少移动次数一次移到挨着的位置,最多移动另一边的距离减一次,所以结果为{1,l2-1}或{l1-1,1},第三种情况,某一边是与中间节点相隔1位,那么最少移动次数为1次,只需要将边上的石子移动到中间就可以了,最多移动次数就是l1+l2-2,因为我们不确定是哪一边相隔一位,所以就写成这样的形式,第四种情况就是两边与中间节点都相隔超过一位,那么最少移动次数就是2,最多移动次数也是l1+l2-2。

code

vector<int> numMovesStones(int a, int b, int c) {
    int max_num=max(c,max(a,b));
    int min_num=min(c,min(a,b));
    int mid_num=a+b+c-max_num-min_num;
    int l1=mid_num-min_num;
    int l2=max_num-mid_num;
    if(l1==1&&l2==1)
    {
        return {0,0};
    }
    if(l1==1&&l2>1)
    {
        return {1,l2-1};
    }
    if(l1>1&&l2==1)
    {
        return {1,l1-1};
    }
    if(l1==2||l2==2)
    {
        return {1,l1+l2-2};
    }
    return {2,l1+l2-2};

}